<template>
  <div class="table">
    <template v-if="!preview">
      <c-pull-select url="/api/v1/configArea/page" label-name="areaName" sort="displayOrder" order="asc" :filters-raw="filtersRaw" :multiple="false" method="post" @change="changeHandle" />
      <el-button type="primary" @click="removeHandle">删除</el-button>
      <Scheme ref="scheme" :detail="detail" @on-change="onChangeHandle" />
    </template>
    <c-table-box
      ref="cTableBox"
      index
      checkbox
      auto-height
      hide-func
      :table-height="400"
      :setting="false"
      :data="showTableData"
      :table-span-method="tableSpanMethod"
      :table-config="tableConfig"
      @selection-change="selectionChangeHandle"
    />
  </div>
</template>
<script>
import Scheme from './Scheme'
const rttf = ['Q014', 'Q015']
import { deepClone } from '@/utils'
const hasPrograms = 'Q014 Q015 Q002 Q003 Q004 Q005 Q019'.split(' ')
import { getSpace } from '@/api/shopDrawing'
export default {
  name: 'Table',
  components: {
    Scheme
  },
  props: {
    tableData: {
      type: Array,
      default: () => []
    },
    detail: {
      type: Object,
      default: () => ({})
    },
    preview: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      tableConfig: {
        setting: [
          {
            prop: 'picTaskName',
            label: '所属图纸名称',
            width: 110,
            fixed: true
          },
          {
            prop: 'areaName',
            label: '所属区域',
            width: 100,
            fixed: true
          },
          {
            prop: 'spaceName',
            label: '所属空间',
            width: 120
          },
          {
            prop: 'isReportPic',
            label: '是否报图',
            width: 100,
            // render: this.switchEditAndText('isReportPic', true, this.createSwitch, this.createIsOrNotOrText, false, { change: this.syncValue('isReportPic', '_groupSpace') })
            render: this.createIsOrNotOrText('isReportPic', false)
          },
          {
            prop: 'isProgramOutpic',
            label: '是否出图',
            width: 100,
            // render: this.switchEditAndText('isProgramOutpic', true, this.createSwitch, this.createIsOrNotOrText, false, { change: this.syncValue('isProgramOutpic', '_groupSpace') })
            render: this.createIsOrNotOrText('isProgramOutpic', false)
          },
          {
            prop: 'actualOutpicArea',
            label: '出图面积',
            width: 160,
            // render: this.switchEditAndText('actualOutpicArea', true, this.createNumber, this.createIsOrNotOrText, true, { change: this.syncValue('actualOutpicArea', '_groupSpace') })
            render: this.enableEditBy('isProgramOutpic', this.switchEditAndText('actualOutpicArea', true, this.createNumber, this.createIsOrNotOrText, true, { change: this.syncValue('actualOutpicArea', '_groupSpace') }))
          },
          {
            prop: 'outpicDesc',
            label: '出图说明',
            minWidth: 200,
            // render: this.switchEditAndText('outpicDesc', true, this.createTextInput, this.createIsOrNotOrText, true, { change: this.syncValue('outpicDesc', '_groupSpace') })
            render: this.enableEditBy('isProgramOutpic', this.switchEditAndText('outpicDesc', true, this.createTextInput, this.createIsOrNotOrText, true, { change: this.syncValue('outpicDesc', '_groupSpace') }))
          },
          {
            prop: 'styleName',
            label: '所属专区',
            width: 120
          },
          {
            prop: 'styleActualOutpicArea',
            label: '出图面积',
            width: 120,
            // render: this.switchEditAndText('styleActualOutpicArea', false, this.createNumber, this.createIsOrNotOrText, true, { change: [this.syncValue('styleActualOutpicArea', '_groupStyle'), this.syncValueSum('styleActualOutpicArea', 'actualOutpicArea', '_groupSpace', this.getStyleActualOutpicAreaValueGroup)] })
            render: this.enableEditBy('RMisStyleOutpic',
              this.switchEditAndText('styleActualOutpicArea',
                false, this.createNumber, this.createIsOrNotOrText, true,
                { change: [this.syncValue('styleActualOutpicArea', '_groupStyle'),
                  this.syncValueSum('styleActualOutpicArea', 'actualOutpicArea', '_groupSpace',
                    this.getStyleActualOutpicAreaValueGroup)] }))
          },
          {
            prop: 'assortCustomizedArea',
            label: '1配套定制出图面积',
            width: 140,
            // render: this.switchEditAndText('assortCustomizedArea', false, this.createNumber, this.createIsOrNotOrText, true, { change: this.syncValue('assortCustomizedArea', '_groupStyle') })
            render: this.enableEditBy('RMisStyleOutpic', this.switchEditAndText('assortCustomizedArea', false, this.createNumber, this.createIsOrNotOrText, true, { change: this.syncValue('assortCustomizedArea', '_groupStyle') }))
          },
          {
            prop: 'styleOutDesc',
            label: '出图说明',
            minWidth: 200,
            // render: this.switchEditAndText('styleOutDesc', false, this.createTextInput, this.createIsOrNotOrText, true, { change: this.syncValue('styleOutDesc', '_groupStyle') })
            render: this.enableEditBy('RMisStyleOutpic', this.switchEditAndText('styleOutDesc', false, this.createTextInput, this.createIsOrNotOrText, true, { change: this.syncValue('styleOutDesc', '_groupStyle') }))
          },
          {
            prop: 'seriesName',
            label: '产品系列',
            width: 120
          },
          {
            prop: 'chooseCustomizedSeriesName',
            label: '配套定制系列',
            width: 140
          },
          {
            prop: 'chooseCupboardSeriesName',
            label: '配套橱柜系列',
            width: 140
          },
          {
            prop: 'isSeriesReportPic',
            label: '是否报图',
            width: 100,
            // render: this.createSwitch('isSeriesReportPic', { change: this.syncValueBySome('isSeriesReportPic', 'isReportPic', '_groupSpace') })
            // render: this.switchEditAndText('isSeriesReportPic', false, this.createSwitch, this.createIsOrNotOrText, false, { change: this.syncValueBySome('isSeriesReportPic', 'isReportPic', '_groupSpace') }, true)
            render: this.createIsOrNotOrText('isSeriesReportPic', false)
          },
          {
            prop: 'isDetailOutpic',
            label: '是否出图',
            width: 100,
            // render: this.createSwitch('isDetailOutpic', { change: this.syncValueBySome('isDetailOutpic', 'isProgramOutpic', '_groupSpace') })
            render: this.switchEditAndText('isDetailOutpic', false, this.createSwitch, this.createIsOrNotOrText, false, {
              change: [
                this.syncValueBySome('isDetailOutpic', 'isProgramOutpic', '_groupSpace'),
                this.syncValueBySome('isDetailOutpic', 'RMisStyleOutpic', '_groupStyle'),
                () => this.onTableDataChange(this.showTableData)
              ],
              'hook:created': [
                this.syncValueBySome('isDetailOutpic', 'isProgramOutpic', '_groupSpace'),
                this.syncValueBySome('isDetailOutpic', 'RMisStyleOutpic', '_groupStyle')
              ]
            }, true)
          }
        ]
      },
      selections: [],
      // showTableData: [],
      filtersRaw: [
        // { key: 'enable', value: 1, operator: '=' }
      ],
      addTableData: [],
      rawTableData: []
    }
  },
  computed: {
    showTableData() {
      return this.handleData([...this.rawTableData, ...this.addTableData])
    }
  },
  watch: {
    tableData: {
      handler(v) {
        this.rawTableData = deepClone(v)
      },
      immediate: true
    },
    showTableData: {
      handler(n) {
        this.onTableDataChange(n)
      },
      immediate: true
    }
  },
  methods: {
    onTableDataChange(n) {
      const hasFinished = (n || []).some(e => {
        return (e.areaCode === 'Q014' || e.areaCode === 'Q015') && this.$isTrue(e.isDetailOutpic, 1, '1')
      })
      this.$emit('on-tabledata-change', hasFinished)
    },
    spaceEditable(row) {
      return !rttf.includes(row.areaCode)
    },
    // 条件编辑
    enableEditBy(key, fun) {
      return (h, row) => {
        const t = row[key]
        if (t === '1' || t === 1 || this.preview) {
          return fun(h, row)
        }
        return h('span', '')
      }
    },

    // 可编辑与不可编辑
    switchEditAndText(key, rttf, editFun, textFun, isText, on, always) {
      return (h, row) => {
        if (this.preview) {
          return textFun(key, isText)(h, row)
        } else if (always) {
          return editFun(key, on)(h, row)
        }
        if (rttf) {
          if (this.spaceEditable(row)) {
            return editFun(key, on)(h, row)
          } else {
            return textFun(key, isText)(h, row)
          }
        } else {
          if (this.spaceEditable(row)) {
            return textFun(key, isText)(h, row)
          } else {
            return editFun(key, on)(h, row)
          }
        }
      }
    },
    // 是否
    createIsOrNotOrText(key, isText) {
      return (h, row) => {
        const v = row[key]
        if (!isText) {
          const text = (v === 1 || v === '1') ? '是' : '否'
          return h('span', text)
        } else {
          return h('span', v)
        }
      }
    },
    // switch
    createSwitch(key, on = {}) {
      on = { ...(on || {}) }
      const input = on.input
      delete on.input
      return (h, row) => {
        const _on = this.wrapHandle(on, row)
        const v = String(row[key] || 0)
        return h('el-switch', {
          props: {
            activeValue: '1',
            inactiveValue: '0',
            value: v
          },
          on: {
            input: v => {
              this.$set(row, key, v)
              if (input instanceof Function) {
                input.call(this, v)
              }
            },
            ..._on
          },
          nativeOn: {
            click: e => {
              e.stopPropagation && e.stopPropagation()
              return false
            }
          }
        })
      }
    },
    // number
    createNumber(key, on = {}) {
      on = { ...(on || {}) }
      const input = on.input
      const that = this
      delete on.input
      return (h, row) => {
        const _on = this.wrapHandle(on, row)
        const v = row[key]
        return h('c-input-number', {
          props: {
            float: true,
            value: v
          },
          on: {
            input: v => {
              that.$set(row, key, v)
              if (input instanceof Function) {
                input.call(that, v)
              }
            },
            ..._on
          },
          nativeOn: {
            click: e => {
              e.stopPropagation && e.stopPropagation()
              return false
            }
          }
        })
      }
    },
    // input
    createTextInput(key, on = {}) {
      on = { ...(on || {}) }
      const input = on.input
      delete on.input
      return (h, row) => {
        const _on = this.wrapHandle(on, row)
        const v = row[key]
        return h('el-input', {
          props: {
            value: v,
            type: 'textarea',
            autosize: { minRow: 1 }
          },
          attrs: {
            maxlength: 1024,
            showWordLimit: true
          },
          on: {
            input: v => {
              this.$set(row, key, v)
              if (input instanceof Function) {
                input.call(this, v)
              }
            },
            ..._on
          },
          nativeOn: {
            click: e => {
              e.stopPropagation && e.stopPropagation()
              return false
            }
          }
        })
      }
    },
    // 处理事件
    wrapHandle(on = {}, ..._args) {
      const t = {}
      Object.entries(on).forEach(function([event, handler]) {
        if (!(handler instanceof Array)) {
          handler = [handler]
        }
        t[event] = function(...args) {
          for (const h of handler) {
            h.call(this, ..._args, ...args)
          }
        }
      })
      return t
    },
    // 同步值
    syncValue(key, groupKey) {
      return (row, v) => {
        // const v = row[key]
        for (const item of row[groupKey] || []) {
          this.$set(item, key, v)
        }
      }
    },
    // 系列报图，出图同步到空间
    syncValueBySome(key, targetKey, groupKey) {
      const fun = this.syncValue(targetKey, groupKey)
      return (row, v) => {
        const group = row[groupKey] || []
        if (v === 1 || v === '1') {
          fun.call(this, row, v)
        } else {
          if (group.some(e => (e[key] === 1 || e[key] === '1'))) {
            fun.call(this, row, '1')
          } else {
            fun.call(this, row, '0')
          }
        }
      }
    },
    // 出图面积汇总
    syncValueSum(key, targetKey, targetGroupKey, getValueGroup) {
      const fun = this.syncValue(targetKey, targetGroupKey)
      return (row, v) => {
        let group
        if (getValueGroup instanceof Function) {
          group = getValueGroup(row, v)
        } else {
          group = row[targetGroupKey] || []
        }
        const value = group.reduce((a, b) => {
          if (typeof a !== 'object') {
            a = { [key]: a }
          }
          let tmp = Number(a[key])
          const a1 = isNaN(tmp) ? 0 : tmp
          tmp = Number(b[key])
          const b1 = isNaN(tmp) ? 0 : tmp
          return a1 + b1
        }, { [key]: 0 })
        fun.call(this, row, value)
      }
    },
    // 去掉重复的
    getStyleActualOutpicAreaValueGroup(row, v) {
      const t = new Set();
      (row._groupSpace || []).forEach(e => {
        t.add((e._groupStyle || [])[0])
      })
      return Array.from(t)
    },

    tableSpanMethod({ row, column, rowIndex, columnIndex }) {
      // 图纸
      if ([2].includes(columnIndex)) {
        return [row._picTaskCodeRowSpan, 1]
      }
      // 区域
      if ([3].includes(columnIndex)) {
        return [row._areaRowSpan, 1]
      }
      // 空间
      if ([4, 5, 6, 7, 8].includes(columnIndex)) {
        return [row._spaceRowSpan, 1]
      }
      if ([9, 10, 11, 12].includes(columnIndex)) {
        return [row._styleRowSpan, 1]
      }
      return [1, 1]
    },
    // arg = {flag, index, groupKey, span}
    classifyFun(data, args) {
      const classify = {}
      const _args = [...args]
      const { flag, index, groupKey, span } = _args.shift()
      for (const item of data) {
        // 先清理数据，方便二次处理
        Object.keys(item).forEach(key => {
          if (/^_.+/.test(key)) {
            delete item[key]
          }
        })
        const f = item[flag] === undefined ? flag : item[flag]
        // const i = item[index] === undefined ? 0 : item[index]
        // const key = `${f}@@${i}`
        const key = `${f}`
        if (classify[key] === undefined) {
          classify[key] = {
            list: [],
            groupKey: `_${groupKey}`,
            span: `_${span}`,
            index: `_${index}`,
            order: item[index]
          }
        }
        if (classify[key].order === undefined) {
          classify[key].order = item[index]
        }
        classify[key].list.push(item)
      }
      if (_args.length > 0) {
        Object.values(classify).forEach(e => {
          e.classify = this.classifyFun(e.list, _args)
        })
      }
      return classify
    },
    handleData(data) {
      // 7.列表显示顺序：先按区域合并展示，区域相同按空间显示顺序displayOrder正序合并展示，
      // 空间相同按专区显示顺序正序合并展示，专区相同的按系列编码从大到小倒序展示
      // areaCode
      //   @ApiModelProperty("区域顺序")
      //   private Integer areaIndex;
      //   @ApiModelProperty("空间顺序")
      //   private Integer spaceIndex;
      //   @ApiModelProperty("专区顺序")
      //   private Integer styleIndex;
      // 按区域分类
      const args = [
        { flag: 'picTaskCode', index: 'picTaskCodeIndex', groupKey: 'groupPicTaskCode', span: 'picTaskCodeRowSpan' },
        { flag: 'areaCode', index: 'areaIndex', groupKey: 'groupArea', span: 'areaRowSpan' },
        { flag: 'spaceCode', index: 'spaceIndex', groupKey: 'groupSpace', span: 'spaceRowSpan' },
        { flag: 'styleCode', index: 'styleIndex', groupKey: 'groupStyle', span: 'styleRowSpan' }
      ]
      const area = this.classifyFun(data, args)
      // 排序函数
      const sort = (data, order = 'asc') => {
        const t = Object.entries(data)
        const l = t.length
        for (let i = 0; i < l; i++) {
          for (let m = i + 1; m < l; m++) {
            const a = t[i]
            // let i1 = Number(a[0].split('@@')[1])
            let i1 = Number(a[1].order)
            if (isNaN(i1)) { i1 = 0 }
            const b = t[m]
            // let i2 = Number(b[0].split('@@')[1])
            let i2 = Number(b[1].order)
            if (isNaN(i2)) { i2 = 0 }
            if (order === 'asc' && i1 > i2) {
              t.splice(i, 1, b)
              t.splice(m, 1, a)
            } else if (order === 'desc' && i1 < i2) {
              t.splice(i, 1, b)
              t.splice(m, 1, a)
            }
          }
        }
        return t
      }
      const result = []
      const collectFun = (data) => {
        const arrs = sort(data)
        arrs.forEach(e => {
          const t = e[1]
          // eslint-disable-next-line no-unused-vars
          const { list, classify, groupKey, span } = t
          list.forEach((e, i) => {
            e[groupKey] = list
          })
          if (classify) {
            collectFun(classify)
          } else {
            // 系列
            list.sort((a, b) => {
              const a1 = Number(a.seriesCode || 0)
              const b1 = Number(b.seriesCode || 0)
              return b1 - a1
            })
            result.push(...list)
          }
        })
      }
      collectFun(area)
      result.forEach((e, i) => {
        const merge = (row, flag, span, groupKey) => {
          if (row[flag]) return
          const list = row[groupKey]
          if (row[flag] === undefined) {
            list.forEach(e => {
              e[flag] = true
              e[span] = 0
            })
            row[span] = list.length
          }
        }
        merge(e, '_picTaskCodeMerge', '_picTaskCodeRowSpan', '_groupPicTaskCode')
        merge(e, '_areaMerge', '_areaRowSpan', '_groupArea')
        merge(e, '_spaceMerge', '_spaceRowSpan', '_groupSpace')
        merge(e, '_styleMerge', '_styleRowSpan', '_groupStyle')
        // 重新同步数据
        this.syncAddValue(e)
      })
      // 处理空间是否报图
      const tmp = {}
      for (const s of result) {
        tmp[s.spaceCode] = s
      }
      Object.values(tmp).forEach(e => {
        this.syncValueBySome('isSeriesReportPic', 'isReportPic', '_groupSpace')(e, e.isSeriesReportPic)
      })
      return result
    },
    // 新增的时候处理数据
    syncAddValue(e) {
      // 软体、套房
      // styleActualOutpicArea、assortCustomizedArea、styleOutDesc
      const syncValue = (row, key, groupKey, isNum = false) => {
        // e[groupKey].forEach(r => { r[key] = e[key] })
        if (row[key] && String(row[key]) !== '0') {
          e[groupKey].forEach(r => {
            this.$set(r, key, e[key] || '')
            // if (!row[key] || row[key] === '0') {
            //   r[key] = e[key]
            // }
          })
        } else {
          // e[groupKey].forEach(r => { r[key] = e[key] })

          e[groupKey].forEach(r => { this.$set(r, key, e[key]) })
        }
      }
      if (['Q014', 'Q015'].includes(e.areaCode)) {
        syncValue(e, 'styleActualOutpicArea', '_groupStyle', true)
        syncValue(e, 'assortCustomizedArea', '_groupStyle', true)
        syncValue(e, 'styleOutDesc', '_groupStyle', false)
      } else {
        // actualOutpicArea、outpicDesc
        syncValue(e, 'actualOutpicArea', '_groupSpace', true)
        syncValue(e, 'outpicDesc', '_groupSpace', true)
      }
    },
    selectionChangeHandle(v) {
      this.selections = v
    },
    changeHandle(v) {
      // console.log(v, '十月页面优化')
      // 1.点击新增后，下拉展示所有启用状态的区域信息；
      // 2.选中某一区域，弹出对应的区域方案选择弹框，若当前区域未维护设计方案（如公共区），则直接在行末新增区域数据
      if (!v || v.length === 0) return
      if (!hasPrograms.includes(v[0].areaCode)) {
        getSpace(v).then(res => {
          if (res.data.records.length > 0) {
            this.onHasSpanceHandle(v, res.data.records)
          } else {
            this.onNoneHandle(v)
          }
        })
      } else {
        const tmp = {}
        this.showTableData.filter(e => e.picTaskCode === this.detail.picTaskCode).forEach(e => {
          if (v.some(ee => ee.areaCode === e.areaCode)) {
            if (tmp[e.areaCode] === undefined) {
              tmp[e.areaCode] = []
            }
            const t = {}
            Object.keys(e).forEach(k => {
              !/^_.+$/.test(k) ? t[k] = e[k] : ''
            })
            tmp[e.areaCode].push(t)
          }
        })
        this.$refs.scheme.openCDialog(v, tmp)
      }
    },
    onChangeHandle(v) {
      // 插入到当前图纸
      // console.log('选择方案', v);
      (v || []).forEach(e => {
        const t = {
          acceptArea:	'', // 验收面积
          acceptDetailArea:	'', // 明细验收面积
          actualApplySampleWay:	'', // 实际上样方式
          actualAreaSum:	'', // 实际报图面积汇总（空间报图面积）
          actualOutpicArea:	'', // 空间出图面积
          actualReportArea:	'', // 实际报图面积（明细报图面积）
          actureApplySampleSpace:	'', // 实际申请上样空间
          adviceArea:	'', // 建议面积
          adviceFirstSampleSpace:	'', // 推荐首选上样空间
          adviceSampleArea:	'', // 建议上样面积
          adviceSecondSampleSpace:	'', // 推荐次选上样空间
          areaCode:	'', // 区域配置ID
          areaIndex:	'', // 区域顺序
          areaName:	'', // 所属区域：'', // 成品、'', // 定制、'', // 卫浴、'', // 橱柜、'', // 样板间
          assortCustomizedArea:	'', // 配套定制出图面积
          assortCustomizedSeriesAcceptArea:	'', // 配套定制验收面积
          assortCustomizedSeriesOutArea:	'', // 配套定制出图面积
          assortEndProductDesc:	'', // 配套成品说明
          bcDrawArea:	'', // 摆场图专区出图面积
          bcMatchingArea:	'', // 摆场图配套定制出图面积
          bcOutpicDesc:	'', // 摆场图空间出图说明
          bcTotalArea:	'', // 摆场图空间出图面积
          chooseCupboardSeriesCode:	'', // 选择配套橱柜系列编码
          configProgramProductSeriesId:	'', // 方案产品配置Id
          configSeriesId:	'', // 系列id
          configStyleId:	'', // 专区id
          constCode:	'', // 门店建设号
          cupboardChecked:	'', // 选择配套橱柜系列名称
          cupboardSeriesCode:	'', // 配套橱柜系列编码
          cupboardSeriesName:	'', // 配套橱柜系列名称
          currentApplyDesignWay:	'', // 本次申请设计方式
          customProductDesc:	'', // 定制产品说明
          customizedChecked:	'', // 选择配套定制系列名称
          customizedSeriesCode:	'', // 配套定制系列编码
          customizedSeriesName:	'', // 配套定制系列名称
          enable:	'', // 是否启用：0'', // 禁用1'', // 启用
          explans:	'', // 说明
          houseType:	'', // 户型
          houseTypePosition:	'', // 户型定位
          isAccept:	'', // 是否验收
          isDetailOutpic:	'', // 是否系列出图
          isMustUp:	'', // 是否必上
          isOutpic:	'', // 是否出图（空间）
          isOutpicDetail:	'', // 明细是否出图
          isProgramOutpic:	'', // 是否空间出图
          isReport:	'', // 是否报图
          isReportPic:	'', // 是否空间报图
          isSeriesReportPic:	'', // 是否系列报图
          marketPosition:	'', // 市场定位
          material:	'', // 材质
          outpicArea:	'', // 出图面积
          outpicAreaDetail:	'', // 明细出图面积
          outpicDesc:	'', // 空间出图说明
          outpicDetailTaskCode:	'', // 出图明细任务号
          picTaskCode:	'', // 图纸编码
          picTaskName:	'', // 图纸任务名
          recommendFirstDesignWay:	'', // 推荐首选设计方式
          recommendSecondDesignWay:	'', // 推荐次选设计方式
          referenceArea:	'', // 参考面积
          roughlyAera:	'', // 大致面积
          sampleArea:	'', // 上样面积
          sampleCode:	'', // 样品编码
          sampleFunctionSpace:	'', // 功能上样空间
          seriesCode:	'', // 系列编码
          seriesDesc:	'', // 系列说明
          seriesName:	'', // 系列名称
          seriesRecommendedLevel:	'', // 系列推荐级别
          seriesReportArea:	'', // 系列报图面积
          seriesStandardColor:	'', // 系列标配色
          spaceCode:	'', // 空间编码
          spaceDesc:	'', // 空间说明
          spaceIndex:	'', // 空间顺序
          spaceName:	'', // 空间名称
          spaceReportArea:	'', // 空间报图面积
          spaceTotalArea:	'', // 空间总面积
          specialAskRemark:	'', // 特殊要求备注
          styleActualOutpicArea:	'', // 专区出图面积
          styleCode:	'', // 专区编码
          styleForm:	'', // 款式形态
          styleIndex:	'', // 专区顺序
          styleName:	'', // 专区名称
          styleOutDesc:	'', // 专区出图说明
          styleReportArea:	'', // 专区报图面积
          suitDesignWay:	'' // 适用设计方式
        }
        for (const key of Object.keys(t)) {
          const _v = e[key]
          if (_v !== undefined && _v !== null) {
            t[key] = _v
          }
        }
        t.actualAreaSum = e.actualAreaSum || 0
        t.actualReportArea = e.actualReportArea || 0
        t.areaIndex = e.areaIndex || 0
        t.configProgramProductSeriesId = e.configProgramProductSeriesId
        t.constCode = this.detail.constCode
        t.enable = '1'
        t.isOutpic = e.isOutpic || '0'
        t.isReport = e.isReport || '0'
        t.picTaskCode = this.detail.picTaskCode
        t.picTaskName = this.detail.picTaskName
        t.spaceIndex = e.spaceIndex || 0
        t.styleIndex = e.styleIndex || 0
        t.isSeriesReportPic = e.isSeriesReportPic || '0'
        t.isDetailOutpic = '1'
        t.RMisStyleOutpic = this.spaceEditable(e) ? '0' : '1'
        t.isReportPic = '0'
        t.isProgramOutpic = this.spaceEditable(e) ? '1' : '0'
        let chooseCustomizedSeriesCode = ''
        let chooseCustomizedSeriesName = ''
        let chooseCupboardSeriesCode = ''
        let chooseCupboardSeriesName = ''
        // 只有套房才需要判断
        if (e.areaCode === 'Q015') {
          if (e.chooseCupboardSeriesName) {
            chooseCupboardSeriesCode = e.chooseCupboardSeriesCode || e.cupboardSeriesCode || e.assortCupboardSeriesCode || ''
            chooseCupboardSeriesName = e.chooseCupboardSeriesName || e.cupboardSeriesName || e.assortCupboardSeriesName || ''
          }
          if (e.chooseCustomizedSeriesName) {
            chooseCustomizedSeriesCode = e.chooseCustomizedSeriesCode || e.customizedSeriesCode || e.assortCustomizedSeriesCode || ''
            chooseCustomizedSeriesName = e.chooseCustomizedSeriesName || e.customizedSeriesName || e.assortCustomizedSeriesName || ''
          }
        } else {
          chooseCupboardSeriesCode = e.chooseCupboardSeriesCode || e.cupboardSeriesCode || e.assortCupboardSeriesCode || ''
          chooseCupboardSeriesName = e.chooseCupboardSeriesName || e.cupboardSeriesName || e.assortCupboardSeriesName || ''
          chooseCustomizedSeriesCode = e.chooseCustomizedSeriesCode || e.customizedSeriesCode || e.assortCustomizedSeriesCode || ''
          chooseCustomizedSeriesName = e.chooseCustomizedSeriesName || e.customizedSeriesName || e.assortCustomizedSeriesName || ''
        }
        t.chooseCustomizedSeriesCode = chooseCustomizedSeriesCode
        t.chooseCustomizedSeriesName = chooseCustomizedSeriesName
        t.chooseCupboardSeriesCode = chooseCupboardSeriesCode
        t.chooseCupboardSeriesName = chooseCupboardSeriesName
        this.addTableData.push(t)
      })
    },
    onNoneHandle(v) {
      // console.log('没有方案', v)
      if (!v || !v.length === 0) return
      const t = this.showTableData.filter(e => e.picTaskCode === this.detail.picTaskCode).map(e => e.areaCode)
      const tmp = []
      v.forEach(e => {
        t.includes(e.areaCode) && tmp.push(e)
      })
      if (tmp.length > 0) {
        this.$message.warning(`区域【${tmp.map(e => e.areaName).join(',')}】已存在，不能新增！`)
        return
      }
      (v || []).forEach(e => {
        const t = {
          acceptArea:	'', // 验收面积
          acceptDetailArea:	'', // 明细验收面积
          actualApplySampleWay:	'', // 实际上样方式
          actualAreaSum:	0, // 实际报图面积汇总（空间报图面积）
          actualOutpicArea:	'', // 空间出图面积
          actualReportArea:	0, // 实际报图面积（明细报图面积）
          actureApplySampleSpace:	'', // 实际申请上样空间
          adviceArea:	'', // 建议面积
          adviceFirstSampleSpace:	'', // 推荐首选上样空间
          adviceSampleArea:	'', // 建议上样面积
          adviceSecondSampleSpace:	'', // 推荐次选上样空间
          areaCode:	e.areaCode, // 区域配置ID
          areaIndex:	e.displayOrder || 0, // 区域顺序
          areaName:	e.areaName, // 所属区域：'', // 成品、'', // 定制、'', // 卫浴、'', // 橱柜、'', // 样板间
          assortCustomizedArea:	'', // 配套定制出图面积
          assortCustomizedSeriesAcceptArea:	'', // 配套定制验收面积
          assortCustomizedSeriesOutArea:	'', // 配套定制出图面积
          assortEndProductDesc:	'', // 配套成品说明
          bcDrawArea:	'', // 摆场图专区出图面积
          bcMatchingArea:	'', // 摆场图配套定制出图面积
          bcOutpicDesc:	'', // 摆场图空间出图说明
          bcTotalArea:	'', // 摆场图空间出图面积
          chooseCupboardSeriesCode:	'', // 选择配套橱柜系列编码
          chooseCupboardSeriesName: '',
          chooseCustomizedSeriesCode: '',
          chooseCustomizedSeriesName: '',
          configProgramProductSeriesId:	'', // 方案产品配置Id
          configSeriesId:	'', // 系列id
          configStyleId:	'', // 专区id
          constCode:	this.detail.constCode, // 门店建设号
          cupboardChecked:	'', // 选择配套橱柜系列名称
          cupboardSeriesCode:	'', // 配套橱柜系列编码
          cupboardSeriesName:	'', // 配套橱柜系列名称
          currentApplyDesignWay:	'', // 本次申请设计方式
          customProductDesc:	'', // 定制产品说明
          customizedChecked:	'', // 选择配套定制系列名称
          customizedSeriesCode:	'', // 配套定制系列编码
          customizedSeriesName:	'', // 配套定制系列名称
          enable:	'1', // 是否启用：0'', // 禁用1'', // 启用
          explans:	'', // 说明
          houseType:	'', // 户型
          houseTypePosition:	'', // 户型定位
          isAccept:	'', // 是否验收
          isDetailOutpic:	'1', // 是否系列出图
          isMustUp:	'', // 是否必上
          isOutpic:	e.isOutpic || '1', // 是否出图（空间）
          isOutpicDetail:	'', // 明细是否出图
          isProgramOutpic:	'1', // 是否空间出图
          isReport:	e.isReport || '1', // 是否报图
          isReportPic:	'0', // 是否空间报图
          isSeriesReportPic:	'0', // 是否系列报图
          marketPosition:	'', // 市场定位
          material:	'', // 材质
          outpicArea:	'', // 出图面积
          outpicAreaDetail:	'', // 明细出图面积
          outpicDesc:	'', // 空间出图说明
          outpicDetailTaskCode:	'', // 出图明细任务号
          picTaskCode:	this.detail.picTaskCode, // 图纸编码
          picTaskName:	this.detail.picTaskName, // 图纸任务名
          recommendFirstDesignWay:	'', // 推荐首选设计方式
          recommendSecondDesignWay:	'', // 推荐次选设计方式
          referenceArea:	'', // 参考面积
          roughlyAera:	'', // 大致面积
          sampleArea:	'', // 上样面积
          sampleCode:	'', // 样品编码
          sampleFunctionSpace:	'', // 功能上样空间
          seriesCode:	'', // 系列编码
          seriesDesc:	'', // 系列说明
          seriesName:	'', // 系列名称
          seriesRecommendedLevel:	'', // 系列推荐级别
          seriesReportArea:	'0', // 系列报图面积
          seriesStandardColor:	'', // 系列标配色
          spaceCode:	'', // 空间编码
          spaceDesc:	'', // 空间说明
          spaceIndex:	0, // 空间顺序
          spaceName:	'', // 空间名称
          spaceReportArea:	'', // 空间报图面积
          spaceTotalArea:	'', // 空间总面积
          specialAskRemark:	'', // 特殊要求备注
          styleActualOutpicArea:	'', // 专区出图面积
          styleCode:	'', // 专区编码
          styleForm:	'', // 款式形态
          styleIndex:	0, // 专区顺序
          styleName:	'', // 专区名称
          styleOutDesc:	'', // 专区出图说明
          styleReportArea:	'', // 专区报图面积
          suitDesignWay:	'' // 适用设计方式
        }
        this.addTableData.push(t)
      })
    },
    onHasSpanceHandle(v, spances) {
      // console.log('没有方案', v)
      if (!v || !v.length === 0) return
      const displayOrderObj = {}
      const t = this.showTableData.filter(e => e.picTaskCode === this.detail.picTaskCode).map(e => e.areaCode)
      const tmp = []
      v.forEach(e => {
        displayOrderObj[e.areaCode] = e.displayOrder
        t.includes(e.areaCode) && tmp.push(e)
      })
      if (tmp.length > 0) {
        this.$message.warning(`区域【${tmp.map(e => e.areaName).join(',')}】已存在，不能新增！`)
        return
      }
      (spances || []).forEach(e => {
        const t = {
          acceptArea:	'', // 验收面积
          acceptDetailArea:	'', // 明细验收面积
          actualApplySampleWay:	'', // 实际上样方式
          actualAreaSum:	0, // 实际报图面积汇总（空间报图面积）
          actualOutpicArea:	'', // 空间出图面积
          actualReportArea:	0, // 实际报图面积（明细报图面积）
          actureApplySampleSpace:	'', // 实际申请上样空间
          adviceArea:	'', // 建议面积
          adviceFirstSampleSpace:	'', // 推荐首选上样空间
          adviceSampleArea:	'', // 建议上样面积
          adviceSecondSampleSpace:	'', // 推荐次选上样空间
          areaCode:	e.areaCode, // 区域配置ID
          areaIndex:	displayOrderObj[e.areaCode] || 0, // 区域顺序
          areaName:	e.areaName, // 所属区域：'', // 成品、'', // 定制、'', // 卫浴、'', // 橱柜、'', // 样板间
          assortCustomizedArea:	'', // 配套定制出图面积
          assortCustomizedSeriesAcceptArea:	'', // 配套定制验收面积
          assortCustomizedSeriesOutArea:	'', // 配套定制出图面积
          assortEndProductDesc:	'', // 配套成品说明
          bcDrawArea:	'', // 摆场图专区出图面积
          bcMatchingArea:	'', // 摆场图配套定制出图面积
          bcOutpicDesc:	'', // 摆场图空间出图说明
          bcTotalArea:	'', // 摆场图空间出图面积
          chooseCupboardSeriesCode:	'', // 选择配套橱柜系列编码
          chooseCupboardSeriesName: '',
          chooseCustomizedSeriesCode: '',
          chooseCustomizedSeriesName: '',
          configProgramProductSeriesId:	'', // 方案产品配置Id
          configSeriesId:	'', // 系列id
          configStyleId:	'', // 专区id
          constCode:	this.detail.constCode, // 门店建设号
          cupboardChecked:	'', // 选择配套橱柜系列名称
          cupboardSeriesCode:	'', // 配套橱柜系列编码
          cupboardSeriesName:	'', // 配套橱柜系列名称
          currentApplyDesignWay:	'', // 本次申请设计方式
          customProductDesc:	'', // 定制产品说明
          customizedChecked:	'', // 选择配套定制系列名称
          customizedSeriesCode:	'', // 配套定制系列编码
          customizedSeriesName:	'', // 配套定制系列名称
          enable:	'1', // 是否启用：0'', // 禁用1'', // 启用
          explans:	'', // 说明
          houseType:	'', // 户型
          houseTypePosition:	'', // 户型定位
          isAccept:	'', // 是否验收
          isDetailOutpic:	'1', // 是否系列出图
          isMustUp:	'', // 是否必上
          isOutpic:	e.isOutpic || '1', // 是否出图（空间）
          isOutpicDetail:	'', // 明细是否出图
          isProgramOutpic:	'1', // 是否空间出图
          isReport:	e.isReport || '1', // 是否报图
          isReportPic:	'0', // 是否空间报图
          isSeriesReportPic:	'0', // 是否系列报图
          marketPosition:	'', // 市场定位
          material:	'', // 材质
          outpicArea:	'', // 出图面积
          outpicAreaDetail:	'', // 明细出图面积
          outpicDesc:	'', // 空间出图说明
          outpicDetailTaskCode:	'', // 出图明细任务号
          picTaskCode:	this.detail.picTaskCode, // 图纸编码
          picTaskName:	this.detail.picTaskName, // 图纸任务名
          recommendFirstDesignWay:	'', // 推荐首选设计方式
          recommendSecondDesignWay:	'', // 推荐次选设计方式
          referenceArea:	'', // 参考面积
          roughlyAera:	'', // 大致面积
          sampleArea:	'', // 上样面积
          sampleCode:	'', // 样品编码
          sampleFunctionSpace:	'', // 功能上样空间
          seriesCode:	'', // 系列编码
          seriesDesc:	'', // 系列说明
          seriesName:	'', // 系列名称
          seriesRecommendedLevel:	'', // 系列推荐级别
          seriesReportArea:	'0', // 系列报图面积
          seriesStandardColor:	'', // 系列标配色
          spaceCode:	e.spaceCode, // 空间编码
          spaceDesc:	'', // 空间说明
          spaceIndex:	e.displayOrder, // 空间顺序
          spaceName:	e.spaceName, // 空间名称
          spaceReportArea:	'', // 空间报图面积
          spaceTotalArea:	'', // 空间总面积
          specialAskRemark:	'', // 特殊要求备注
          styleActualOutpicArea:	'', // 专区出图面积
          styleCode:	'', // 专区编码
          styleForm:	'', // 款式形态
          styleIndex:	0, // 专区顺序
          styleName:	'', // 专区名称
          styleOutDesc:	'', // 专区出图说明
          styleReportArea:	'', // 专区报图面积
          suitDesignWay:	'' // 适用设计方式
        }
        this.addTableData.push(t)
      })
    },
    // 删除
    removeHandle() {
      if (!this.singleJudge(this.selections, '删除')) {
        return
      }
      // 只能删除“是否报图”为否的数据
      const t = []
      this.selections.forEach((e, i) => {
        if (this.$isTrue(e.isSeriesReportPic, '1', 1)) {
          t.push(i + 1)
        }
      })
      if (t.length > 0) {
        this.$message.warning(`所选第${t.join(',')}行【是否报图】为是不能删除！`)
        return
      }
      this.rawTableData = this.rawTableData.filter(e => {
        return !this.selections.includes(e)
      })
      this.addTableData = this.addTableData.filter(e => {
        return !this.selections.includes(e)
      })
      this.selections = []
      this.$nextTick(() => {
        // 重新计算出图面积
        const fun = this.syncValueSum('styleActualOutpicArea', 'actualOutpicArea', '_groupSpace', this.getStyleActualOutpicAreaValueGroup)
        for (const row of this.showTableData) {
          if (this.spaceEditable(row)) continue
          fun.call(this, row, row.styleActualOuiftpicArea)
        }
      })
    },
    // 校验数据
    validate(isPromise = true) {
      const result = []
      const msg = (a, i, b) => {
        const m = typeof i === 'number' ? `${a}第${i + 1}行${b}!` : `${a}${i}${b}!`
        this.$message.warning(m)
        return isPromise ? Promise.reject(m) : false
      }
      for (let i = 0; i < this.showTableData.length; i++) {
        const v = { ...this.showTableData[i] }
        Object.keys(v).forEach(key => {
          if (/^_.+/.test(key) || /^RM.+/.test(key)) {
            delete v[key]
          }
        })
        // 若所属区域为“软体”或“成品套房”，则出图面积及配套定制出图面积填到专区维度，是否出图维护到专区+系列维度，方案上的实际出图面积通过专区出图面积自动汇总显示，
        // 不允许修改，当已出图系列有对应配套定制系列时，专区对应配套定制面积必填
        if (['Q014', 'Q015'].includes(v.areaCode)) {
          if (this.$isTrue(v.isDetailOutpic, 1, '1')) {
            if (!this.$gtEmpty(v.styleActualOutpicArea)) {
              return msg('请填写【', v.styleName, '】出图面积')
            }
            if (v.chooseCustomizedSeriesName && !this.$gtEmpty(v.assortCustomizedArea)) {
              return msg('请填写【', v.styleName, '】配套定制出图面积')
            }
          }
        } else {
          if (this.$isTrue(v.isProgramOutpic, 1, '1')) {
            if (!this.$gtEmpty(v.actualOutpicArea)) {
              return msg('请填写【', v.spaceName, '】出图面积')
            }
          }
        }
        for (const k of 'isDetailOutpic isOutpic isProgramOutpic isReport isReportPic isSeriesReportPic'.split(' ')) {
          if (v[k] === undefined || v[k] === '') {
            v[k] = 0
          }
        }
        // assortCustomizedSeriesOutArea assortCustomizedArea
        v.assortCustomizedSeriesOutArea = v.assortCustomizedArea
        result.push(v)
      }
      return isPromise ? Promise.resolve(result) : result
    }
  }
}
</script>
<style lang="scss" scoped>
.table{
  padding-top: 12px;
  & /deep/ .el-table__row{
    background-color: #fff !important;
  }
  & /deep/ .hover-row{
    background-color: #fff !important;
  }
  & /deep/ td{
    background-color: #fff !important;
  }
}
</style>
